package server.display;

import com.esotericsoftware.minlog.Log;
import java.awt.Dimension;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.sound.sampled.LineUnavailableException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import net.packet.FileDownload;
import server.ServerManager;
import server.util.model.EnvironmentVariablesTableModel;
import server.util.model.TaskListTableModel;
import util.Client;
import util.Monitor;
import util.Sound;
import util.Task;

public class ClientControl extends javax.swing.JDialog {

    private ServerManager server;
    private Client client;

    private TaskListTableModel taskListTableModel;
    private EnvironmentVariablesTableModel environmentVariablesTableModel;

    public ClientControl(java.awt.Frame parent, boolean modal) {
        this(parent, modal, null, null);
    }

    public ClientControl(java.awt.Frame parent, boolean modal, ServerManager server, Client client) {
        super(parent, modal);

        this.server = server;
        this.client = client;

        taskListTableModel = new TaskListTableModel();
        environmentVariablesTableModel = new EnvironmentVariablesTableModel();

        /**
         * GUI
         */
        initComponents();
        this.setLocationRelativeTo(null);
        this.setTitle(String.format("Client Control - %s", client));

        tfScreenshotSaveTo.setText(util.Utilities.getUserDirectoryPath());
        tfScreenshotSaveTo.setMaximumSize(new Dimension(tfScreenshotSaveTo.getWidth(), tfScreenshotSaveTo.getHeight()));

        taskListTableModel.setTable(tbTaskManagerTable);
        tbTaskManagerTable.setModel(taskListTableModel);
        tbEnvironmentVariables.setModel(environmentVariablesTableModel);

        pnPianoPanel.setClientControl(this);

        if (client.cdDrive != null) {
            btFunFunctionsOpenCDDrive.setEnabled(true);
            btFunFunctionsCloseCDDrive.setEnabled(true);
        }
    }

    public ServerManager getServerManager() {
        return server;
    }

    public Client getClient() {
        return client;
    }

    public void updateCommandResponse(String s) {
        lbCommandError.setText("Reply recieved!");
        taCommandOutput.setText(s);
    }

    public String getScreenshotSaveTo() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");

        return String.format("%s\\screenshot_%s.jpg", tfScreenshotSaveTo.getText(), dateFormat.format(new Date()));
    }

    public void updateCDDriveInformation(String s) {
        if (s == null) {
            lbFunFunctionsCDDriveResponse.setText("Found no CD-Drive.");
        } else {
            lbFunFunctionsCDDriveResponse.setText(String.format("Found CD-Drive %s.", s));
            client.cdDrive = s;

            btFunFunctionsOpenCDDrive.setEnabled(true);
            btFunFunctionsCloseCDDrive.setEnabled(true);
        }
    }

    public void updateCDDriveResponse(String response) {
        lbFunFunctionsCDDriveResponse.setText(response);
    }

    public void refrehTaskList(String[] tasks) {
        List<Task> list = new ArrayList<>();

        for (String task : tasks) {
            list.add(new Task(task));
        }

        taskListTableModel.addTasks(true, list);
    }

    public void updateTaskKillResponse(String response) {
        lbTaskManagerTaskKillResponse.setText(response);
    }

    public void pianoPlaySound(int frequency) {
        if (cbPianoAlsoPlayOnServer.isSelected()) {
            try {
                Sound.beep(frequency, 50);
            } catch (LineUnavailableException ex) {
                server.writeToLog(Log.LEVEL_ERROR, "[ClientControl] Failed to play piano sound", ex);
            }
        }

        net.packet.Beep packet = new net.packet.Beep();

        packet.frequency = frequency;
        packet.duration = 50;
        packet.volume = 1.0;

        client.getConnection().sendUDP(packet);
    }

    public void updateFileDownloadProgress(long receivedBytes, long fileSize, double downloadSpeed) {
        int value = (int) (((receivedBytes / 1024.0) / (fileSize / 1024.0)) * 100.0);

        if (pbDownloadFileProgress.getValue() < value) {
            pbDownloadFileProgress.setValue(value);
        }

        lbDownloadFileDownloadSpeed.setText(String.format("~ %.2f kbps", downloadSpeed));
        lbDownloadFileReceived.setText(String.format("%d of %d kb received", receivedBytes / 1024, fileSize / 1024));

        if (receivedBytes >= fileSize) { // Download finished
            pbDownloadFileProgress.setValue(pbDownloadFileProgress.getMinimum());

            btDownloadFileDownloadFile.setEnabled(true);
            btDownloadFileStopDownload.setEnabled(false);
            btDownloadFilePauseDownload.setEnabled(false);
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        rbGroupMessageBoxIcon = new javax.swing.ButtonGroup();
        rbGroupScreenshotMonitor = new javax.swing.ButtonGroup();
        rbGroupRemoteDesktopMonitor = new javax.swing.ButtonGroup();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        tpSystemInfoInner = new javax.swing.JTabbedPane();
        jPanel2 = new javax.swing.JPanel();
        jPanel4 = new javax.swing.JPanel();
        jPanel19 = new javax.swing.JPanel();
        jScrollPane4 = new javax.swing.JScrollPane();
        tbEnvironmentVariables = new javax.swing.JTable();
        btEnviromentVariablesRefreshList = new javax.swing.JButton();
        btEnviromentVariablesCopySelectedRows = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        tpSystemFunctionsInner = new javax.swing.JTabbedPane();
        jPanel5 = new javax.swing.JPanel();
        btTaskManagerRefreshTasklist = new javax.swing.JButton();
        btTaskManagerKillTask = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        tbTaskManagerTable = new javax.swing.JTable();
        lbTaskManagerTaskKillResponse = new javax.swing.JLabel();
        jPanel8 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        tfCommand = new javax.swing.JTextField();
        btCommandSend = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        taCommandOutput = new javax.swing.JTextArea();
        jLabel5 = new javax.swing.JLabel();
        lbCommandError = new javax.swing.JLabel();
        jPanel6 = new javax.swing.JPanel();
        jTabbedPane4 = new javax.swing.JTabbedPane();
        jPanel11 = new javax.swing.JPanel();
        btFunFunctionsOpenCDDrive = new javax.swing.JButton();
        btFunFunctionsCloseCDDrive = new javax.swing.JButton();
        lbFunFunctionsCDDriveResponse = new javax.swing.JLabel();
        btFunFunctionsGetCDDriveInformation = new javax.swing.JButton();
        jPanel7 = new javax.swing.JPanel();
        btMessageBoxSend = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        tfMessageBoxTitle = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        tfMessageBoxMessage = new javax.swing.JTextField();
        rbMessageBoxInformation = new javax.swing.JRadioButton();
        rbMessageBoxQuestion = new javax.swing.JRadioButton();
        rbMessageBoxWarning = new javax.swing.JRadioButton();
        rbMessageBoxError = new javax.swing.JRadioButton();
        rbMessageBoxNone = new javax.swing.JRadioButton();
        jLabel3 = new javax.swing.JLabel();
        jPanel16 = new javax.swing.JPanel();
        jLabel16 = new javax.swing.JLabel();
        tfBeepSoundFrequency = new javax.swing.JTextField();
        jLabel17 = new javax.swing.JLabel();
        tfBeepSoundDuration = new javax.swing.JTextField();
        jLabel18 = new javax.swing.JLabel();
        slBeepSoundVolume = new javax.swing.JSlider();
        btBeepSoundSendBeepSound = new javax.swing.JButton();
        lbBeepSoundOutput = new javax.swing.JLabel();
        btBeepSoundTestBeepSound = new javax.swing.JButton();
        jPanel17 = new javax.swing.JPanel();
        pnPianoPanel = new server.util.panel.ClientControlPianoPanel();
        cbPianoAlsoPlayOnServer = new javax.swing.JCheckBox();
        jPanel18 = new javax.swing.JPanel();
        jLabel20 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        taPrintText = new javax.swing.JTextArea();
        btPrintGetPrinterInformation = new javax.swing.JButton();
        btPrintPrint = new javax.swing.JButton();
        cbPrintPrinterList = new javax.swing.JComboBox();
        jPanel9 = new javax.swing.JPanel();
        jTabbedPane5 = new javax.swing.JTabbedPane();
        jPanel10 = new javax.swing.JPanel();
        btScreenshotTakeScreenshot = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        slScreenshotScale = new javax.swing.JSlider();
        slScreenshotQuality = new javax.swing.JSlider();
        tfScreenshotQuality = new javax.swing.JTextField();
        tfScreenshotScale = new javax.swing.JTextField();
        rbScreenshotActiveMonitor = new javax.swing.JRadioButton();
        rbScreenshotDefaultMonitor = new javax.swing.JRadioButton();
        jLabel9 = new javax.swing.JLabel();
        tfScreenshotSaveTo = new javax.swing.JTextField();
        btScreenshotSaveToBrowse = new javax.swing.JButton();
        jPanel12 = new javax.swing.JPanel();
        btRemoteDesktopStartCapture = new javax.swing.JButton();
        jLabel10 = new javax.swing.JLabel();
        tfRemoteDesktopSendFrameEvery = new javax.swing.JTextField();
        jLabel11 = new javax.swing.JLabel();
        rbRemoteDesktopActiveMonitor = new javax.swing.JRadioButton();
        jLabel13 = new javax.swing.JLabel();
        tfRemoteDesktopScale = new javax.swing.JTextField();
        jLabel14 = new javax.swing.JLabel();
        tfRemoteDesktopQuality = new javax.swing.JTextField();
        rbRemoteDesktopDefaultMonitor = new javax.swing.JRadioButton();
        jLabel12 = new javax.swing.JLabel();
        slRemoteDesktopQuality = new javax.swing.JSlider();
        slRemoteDesktopScale = new javax.swing.JSlider();
        jPanel13 = new javax.swing.JPanel();
        jTabbedPane6 = new javax.swing.JTabbedPane();
        jPanel14 = new javax.swing.JPanel();
        jLabel15 = new javax.swing.JLabel();
        tfOpenWebsiteURL = new javax.swing.JTextField();
        tfOpenWebsiteOpenWebsite = new javax.swing.JButton();
        jPanel15 = new javax.swing.JPanel();
        jLabel19 = new javax.swing.JLabel();
        tfDownloadFileURL = new javax.swing.JTextField();
        btDownloadFileDownloadFile = new javax.swing.JButton();
        pbDownloadFileProgress = new javax.swing.JProgressBar();
        btDownloadFileStopDownload = new javax.swing.JButton();
        lbDownloadFileDownloadSpeed = new javax.swing.JLabel();
        lbDownloadFileReceived = new javax.swing.JLabel();
        btDownloadFilePauseDownload = new javax.swing.JButton();
        cbDownloadFileExecute = new javax.swing.JCheckBox();
        jLabel21 = new javax.swing.JLabel();
        cbDownloadFileSaveTo = new javax.swing.JComboBox();
        jLabel22 = new javax.swing.JLabel();
        tfDownloadFileExecutionDelay = new javax.swing.JTextField();
        cbDownloadFileHide = new javax.swing.JCheckBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jTabbedPane1.setTabPlacement(javax.swing.JTabbedPane.LEFT);

        tpSystemInfoInner.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                tpSystemInfoInnerStateChanged(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 909, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 555, Short.MAX_VALUE)
        );

        tpSystemInfoInner.addTab("Operating System", jPanel2);

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 909, Short.MAX_VALUE)
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 555, Short.MAX_VALUE)
        );

        tpSystemInfoInner.addTab("Java", jPanel4);

        tbEnvironmentVariables.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane4.setViewportView(tbEnvironmentVariables);

        btEnviromentVariablesRefreshList.setText("Refresh List");
        btEnviromentVariablesRefreshList.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btEnviromentVariablesRefreshListActionPerformed(evt);
            }
        });

        btEnviromentVariablesCopySelectedRows.setText("Copy Selected Row(s)");
        btEnviromentVariablesCopySelectedRows.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btEnviromentVariablesCopySelectedRowsActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel19Layout = new javax.swing.GroupLayout(jPanel19);
        jPanel19.setLayout(jPanel19Layout);
        jPanel19Layout.setHorizontalGroup(
            jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel19Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 889, Short.MAX_VALUE)
                    .addGroup(jPanel19Layout.createSequentialGroup()
                        .addComponent(btEnviromentVariablesRefreshList)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btEnviromentVariablesCopySelectedRows)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel19Layout.setVerticalGroup(
            jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel19Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 504, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btEnviromentVariablesRefreshList)
                    .addComponent(btEnviromentVariablesCopySelectedRows))
                .addContainerGap())
        );

        tpSystemInfoInner.addTab("Environment Variables", jPanel19);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tpSystemInfoInner)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tpSystemInfoInner)
        );

        jTabbedPane1.addTab("System Info", jPanel1);

        tpSystemFunctionsInner.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                tpSystemFunctionsInnerStateChanged(evt);
            }
        });

        btTaskManagerRefreshTasklist.setText("Refresh Tasklist");
        btTaskManagerRefreshTasklist.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btTaskManagerRefreshTasklistActionPerformed(evt);
            }
        });

        btTaskManagerKillTask.setText("Kill Task");
        btTaskManagerKillTask.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btTaskManagerKillTaskActionPerformed(evt);
            }
        });

        tbTaskManagerTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane2.setViewportView(tbTaskManagerTable);

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel5Layout.createSequentialGroup()
                                .addGap(188, 188, 188)
                                .addComponent(lbTaskManagerTaskKillResponse))
                            .addGroup(jPanel5Layout.createSequentialGroup()
                                .addComponent(btTaskManagerRefreshTasklist)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btTaskManagerKillTask)))
                        .addContainerGap(711, Short.MAX_VALUE))
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING)))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lbTaskManagerTaskKillResponse)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 498, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btTaskManagerRefreshTasklist)
                    .addComponent(btTaskManagerKillTask))
                .addContainerGap())
        );

        tpSystemFunctionsInner.addTab("Task Manager", jPanel5);

        jLabel4.setText("Command:");

        tfCommand.setText("systeminfo");

        btCommandSend.setText("Send Command");
        btCommandSend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btCommandSendActionPerformed(evt);
            }
        });

        taCommandOutput.setColumns(20);
        taCommandOutput.setFont(new java.awt.Font("Lucida Console", 0, 13)); // NOI18N
        taCommandOutput.setRows(5);
        taCommandOutput.setText("How to use this!\n\nExternal executables can be extecuted by simply writing the command into the input e.g:\n\t\n\ttasklist\n\ttaskill\n\texplorer\n\tsysteminfo\n\nInternal commands (implemented into the cmd itself) can be executed like this:\n\n\tcmd.exe /c echo hello\n\tcmd.exe /c dir\n");
        jScrollPane1.setViewportView(taCommandOutput);

        jLabel5.setText("Output");

        javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8);
        jPanel8.setLayout(jPanel8Layout);
        jPanel8Layout.setHorizontalGroup(
            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel8Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1)
                    .addGroup(jPanel8Layout.createSequentialGroup()
                        .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel5)
                            .addGroup(jPanel8Layout.createSequentialGroup()
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(lbCommandError)
                                    .addGroup(jPanel8Layout.createSequentialGroup()
                                        .addComponent(tfCommand, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(btCommandSend, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                        .addGap(0, 373, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel8Layout.setVerticalGroup(
            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel8Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(tfCommand, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btCommandSend))
                .addGap(1, 1, 1)
                .addComponent(lbCommandError)
                .addGap(3, 3, 3)
                .addComponent(jLabel5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 486, Short.MAX_VALUE)
                .addContainerGap())
        );

        tpSystemFunctionsInner.addTab("Remote CMD", jPanel8);

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tpSystemFunctionsInner, javax.swing.GroupLayout.Alignment.TRAILING)
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tpSystemFunctionsInner)
        );

        jTabbedPane1.addTab("System Functions", jPanel3);

        btFunFunctionsOpenCDDrive.setText("Open CD-Drive");
        btFunFunctionsOpenCDDrive.setEnabled(false);
        btFunFunctionsOpenCDDrive.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btFunFunctionsOpenCDDriveActionPerformed(evt);
            }
        });

        btFunFunctionsCloseCDDrive.setText("Close CD-Drive");
        btFunFunctionsCloseCDDrive.setEnabled(false);
        btFunFunctionsCloseCDDrive.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btFunFunctionsCloseCDDriveActionPerformed(evt);
            }
        });

        btFunFunctionsGetCDDriveInformation.setText("Get CD-Drive Information");
        btFunFunctionsGetCDDriveInformation.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btFunFunctionsGetCDDriveInformationActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel11Layout = new javax.swing.GroupLayout(jPanel11);
        jPanel11.setLayout(jPanel11Layout);
        jPanel11Layout.setHorizontalGroup(
            jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel11Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btFunFunctionsGetCDDriveInformation)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btFunFunctionsOpenCDDrive)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btFunFunctionsCloseCDDrive)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lbFunFunctionsCDDriveResponse)
                .addContainerGap(518, Short.MAX_VALUE))
        );
        jPanel11Layout.setVerticalGroup(
            jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel11Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btFunFunctionsOpenCDDrive)
                    .addComponent(btFunFunctionsCloseCDDrive)
                    .addComponent(lbFunFunctionsCDDriveResponse)
                    .addComponent(btFunFunctionsGetCDDriveInformation))
                .addContainerGap(521, Short.MAX_VALUE))
        );

        jTabbedPane4.addTab("General", jPanel11);

        btMessageBoxSend.setText("Send Message");
        btMessageBoxSend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btMessageBoxSendActionPerformed(evt);
            }
        });

        jLabel1.setText("Title:");

        tfMessageBoxTitle.setText("System Message");

        jLabel2.setText("Message:");

        tfMessageBoxMessage.setText("System.Property read failed!");

        rbGroupMessageBoxIcon.add(rbMessageBoxInformation);
        rbMessageBoxInformation.setText("Information");

        rbGroupMessageBoxIcon.add(rbMessageBoxQuestion);
        rbMessageBoxQuestion.setText("Question");

        rbGroupMessageBoxIcon.add(rbMessageBoxWarning);
        rbMessageBoxWarning.setText("Warning");

        rbGroupMessageBoxIcon.add(rbMessageBoxError);
        rbMessageBoxError.setSelected(true);
        rbMessageBoxError.setText("Error");

        rbGroupMessageBoxIcon.add(rbMessageBoxNone);
        rbMessageBoxNone.setText("None");

        jLabel3.setText("Icon:");

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel2)
                    .addComponent(jLabel1)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tfMessageBoxTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfMessageBoxMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel7Layout.createSequentialGroup()
                        .addComponent(rbMessageBoxQuestion)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rbMessageBoxInformation)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rbMessageBoxWarning)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rbMessageBoxError)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(rbMessageBoxNone))
                    .addComponent(btMessageBoxSend))
                .addContainerGap(534, Short.MAX_VALUE))
        );
        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tfMessageBoxTitle, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(tfMessageBoxMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(rbMessageBoxInformation)
                    .addComponent(rbMessageBoxQuestion)
                    .addComponent(rbMessageBoxWarning)
                    .addComponent(rbMessageBoxError)
                    .addComponent(rbMessageBoxNone)
                    .addComponent(jLabel3))
                .addGap(18, 18, 18)
                .addComponent(btMessageBoxSend)
                .addContainerGap(427, Short.MAX_VALUE))
        );

        jTabbedPane4.addTab("Message Box", jPanel7);

        jLabel16.setText("Frequency (10-10000 Hz):");

        tfBeepSoundFrequency.setText("500");

        jLabel17.setText("Duration (10-10000 ms):");

        tfBeepSoundDuration.setText("1000");

        jLabel18.setText("Volume:");

        slBeepSoundVolume.setPaintTicks(true);
        slBeepSoundVolume.setSnapToTicks(true);
        slBeepSoundVolume.setToolTipText("");
        slBeepSoundVolume.setValue(100);

        btBeepSoundSendBeepSound.setText("Send Beep Sound");
        btBeepSoundSendBeepSound.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btBeepSoundSendBeepSoundActionPerformed(evt);
            }
        });

        btBeepSoundTestBeepSound.setText("Test Beep Sound");
        btBeepSoundTestBeepSound.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btBeepSoundTestBeepSoundActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel16Layout = new javax.swing.GroupLayout(jPanel16);
        jPanel16.setLayout(jPanel16Layout);
        jPanel16Layout.setHorizontalGroup(
            jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel16Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel18)
                    .addComponent(jLabel16)
                    .addComponent(jLabel17))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel16Layout.createSequentialGroup()
                        .addComponent(btBeepSoundTestBeepSound)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btBeepSoundSendBeepSound))
                    .addComponent(lbBeepSoundOutput)
                    .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(tfBeepSoundDuration, javax.swing.GroupLayout.DEFAULT_SIZE, 90, Short.MAX_VALUE)
                        .addComponent(tfBeepSoundFrequency))
                    .addComponent(slBeepSoundVolume, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(530, Short.MAX_VALUE))
        );
        jPanel16Layout.setVerticalGroup(
            jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel16Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel16)
                    .addComponent(tfBeepSoundFrequency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tfBeepSoundDuration, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel17))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel18)
                    .addComponent(slBeepSoundVolume, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btBeepSoundTestBeepSound)
                    .addComponent(btBeepSoundSendBeepSound))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lbBeepSoundOutput)
                .addContainerGap(414, Short.MAX_VALUE))
        );

        jTabbedPane4.addTab("Beep Sound", jPanel16);

        javax.swing.GroupLayout pnPianoPanelLayout = new javax.swing.GroupLayout(pnPianoPanel);
        pnPianoPanel.setLayout(pnPianoPanelLayout);
        pnPianoPanelLayout.setHorizontalGroup(
            pnPianoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 561, Short.MAX_VALUE)
        );
        pnPianoPanelLayout.setVerticalGroup(
            pnPianoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 401, Short.MAX_VALUE)
        );

        cbPianoAlsoPlayOnServer.setText("Also play sounds on the server.");

        javax.swing.GroupLayout jPanel17Layout = new javax.swing.GroupLayout(jPanel17);
        jPanel17.setLayout(jPanel17Layout);
        jPanel17Layout.setHorizontalGroup(
            jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel17Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(pnPianoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(cbPianoAlsoPlayOnServer)
                .addContainerGap(143, Short.MAX_VALUE))
        );
        jPanel17Layout.setVerticalGroup(
            jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel17Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(cbPianoAlsoPlayOnServer)
                    .addComponent(pnPianoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(143, Short.MAX_VALUE))
        );

        jTabbedPane4.addTab("Piano", jPanel17);

        jLabel20.setText("Text:");

        taPrintText.setColumns(20);
        taPrintText.setRows(5);
        taPrintText.setText("NOT IMPLEMENTED YET");
        jScrollPane3.setViewportView(taPrintText);

        btPrintGetPrinterInformation.setText("Get Printer Information");
        btPrintGetPrinterInformation.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPrintGetPrinterInformationActionPerformed(evt);
            }
        });

        btPrintPrint.setText("Print");
        btPrintPrint.setEnabled(false);
        btPrintPrint.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPrintPrintActionPerformed(evt);
            }
        });

        cbPrintPrinterList.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select Printer" }));
        cbPrintPrinterList.setEnabled(false);

        javax.swing.GroupLayout jPanel18Layout = new javax.swing.GroupLayout(jPanel18);
        jPanel18.setLayout(jPanel18Layout);
        jPanel18Layout.setHorizontalGroup(
            jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel18Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel20)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel18Layout.createSequentialGroup()
                        .addComponent(btPrintGetPrinterInformation)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbPrintPrinterList, javax.swing.GroupLayout.PREFERRED_SIZE, 330, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btPrintPrint)
                        .addGap(0, 319, Short.MAX_VALUE))
                    .addComponent(jScrollPane3))
                .addContainerGap())
        );
        jPanel18Layout.setVerticalGroup(
            jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel18Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel20))
                .addGap(18, 18, 18)
                .addGroup(jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(btPrintGetPrinterInformation)
                        .addComponent(cbPrintPrinterList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(btPrintPrint))
                .addContainerGap(203, Short.MAX_VALUE))
        );

        jTabbedPane4.addTab("Print", jPanel18);

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jTabbedPane4)
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jTabbedPane4)
        );

        jTabbedPane1.addTab("Fun Functions", jPanel6);

        btScreenshotTakeScreenshot.setText("Take Screenshot");
        btScreenshotTakeScreenshot.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btScreenshotTakeScreenshotActionPerformed(evt);
            }
        });

        jLabel6.setText("Select Monitor:");

        jLabel7.setText("Select Quality:");

        jLabel8.setText("Select Scale:");

        slScreenshotScale.setValue(75);
        slScreenshotScale.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                slScreenshotScaleStateChanged(evt);
            }
        });

        slScreenshotQuality.setValue(25);
        slScreenshotQuality.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                slScreenshotQualityStateChanged(evt);
            }
        });

        tfScreenshotQuality.setText("0.25");

        tfScreenshotScale.setText("0.75");

        rbGroupScreenshotMonitor.add(rbScreenshotActiveMonitor);
        rbScreenshotActiveMonitor.setSelected(true);
        rbScreenshotActiveMonitor.setText("Active Monitor");

        rbGroupScreenshotMonitor.add(rbScreenshotDefaultMonitor);
        rbScreenshotDefaultMonitor.setText("Default Monitor");

        jLabel9.setText("Save to:");

        tfScreenshotSaveTo.setText("C:\\");

            btScreenshotSaveToBrowse.setText("...");
            btScreenshotSaveToBrowse.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btScreenshotSaveToBrowseActionPerformed(evt);
                }
            });

            javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10);
            jPanel10.setLayout(jPanel10Layout);
            jPanel10Layout.setHorizontalGroup(
                jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel10Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel10Layout.createSequentialGroup()
                            .addComponent(jLabel6)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(rbScreenshotActiveMonitor)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(rbScreenshotDefaultMonitor))
                        .addGroup(jPanel10Layout.createSequentialGroup()
                            .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jLabel7)
                                .addComponent(jLabel8)
                                .addComponent(jLabel9))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(btScreenshotTakeScreenshot)
                                .addGroup(jPanel10Layout.createSequentialGroup()
                                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(tfScreenshotSaveTo, javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(slScreenshotQuality, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
                                        .addComponent(slScreenshotScale, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(tfScreenshotScale, javax.swing.GroupLayout.DEFAULT_SIZE, 40, Short.MAX_VALUE)
                                        .addComponent(tfScreenshotQuality)
                                        .addComponent(btScreenshotSaveToBrowse, javax.swing.GroupLayout.PREFERRED_SIZE, 1, Short.MAX_VALUE))))))
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            jPanel10Layout.setVerticalGroup(
                jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel10Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel6)
                        .addComponent(rbScreenshotActiveMonitor)
                        .addComponent(rbScreenshotDefaultMonitor))
                    .addGap(6, 6, 6)
                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(slScreenshotQuality, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(tfScreenshotQuality, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel7)))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(slScreenshotScale, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel8)
                            .addComponent(tfScreenshotScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel9)
                        .addComponent(tfScreenshotSaveTo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btScreenshotSaveToBrowse))
                    .addGap(18, 18, 18)
                    .addComponent(btScreenshotTakeScreenshot)
                    .addGap(328, 328, 328))
            );

            jTabbedPane5.addTab("Screenshot", jPanel10);

            btRemoteDesktopStartCapture.setText("Start Capture");
            btRemoteDesktopStartCapture.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btRemoteDesktopStartCaptureActionPerformed(evt);
                }
            });

            jLabel10.setText("Send frame every");

            tfRemoteDesktopSendFrameEvery.setText("1000");

            jLabel11.setText("milliseconds.");

            rbGroupRemoteDesktopMonitor.add(rbRemoteDesktopActiveMonitor);
            rbRemoteDesktopActiveMonitor.setSelected(true);
            rbRemoteDesktopActiveMonitor.setText("Active Monitor");

            jLabel13.setText("Select Monitor:");

            tfRemoteDesktopScale.setText("0.60");

            jLabel14.setText("Select Quality:");

            tfRemoteDesktopQuality.setText("0.35");

            rbGroupRemoteDesktopMonitor.add(rbRemoteDesktopDefaultMonitor);
            rbRemoteDesktopDefaultMonitor.setText("Default Monitor");

            jLabel12.setText("Select Scale:");

            slRemoteDesktopQuality.setToolTipText("");
            slRemoteDesktopQuality.setValue(35);
            slRemoteDesktopQuality.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent evt) {
                    slRemoteDesktopQualityStateChanged(evt);
                }
            });

            slRemoteDesktopScale.setValue(60);
            slRemoteDesktopScale.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent evt) {
                    slRemoteDesktopScaleStateChanged(evt);
                }
            });

            javax.swing.GroupLayout jPanel12Layout = new javax.swing.GroupLayout(jPanel12);
            jPanel12.setLayout(jPanel12Layout);
            jPanel12Layout.setHorizontalGroup(
                jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel12Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(btRemoteDesktopStartCapture)
                        .addGroup(jPanel12Layout.createSequentialGroup()
                            .addComponent(jLabel10)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(tfRemoteDesktopSendFrameEvery, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jLabel11))
                        .addGroup(jPanel12Layout.createSequentialGroup()
                            .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jLabel14)
                                .addComponent(jLabel12))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(jPanel12Layout.createSequentialGroup()
                                    .addComponent(slRemoteDesktopQuality, javax.swing.GroupLayout.PREFERRED_SIZE, 235, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGap(8, 8, 8))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel12Layout.createSequentialGroup()
                                    .addComponent(slRemoteDesktopScale, javax.swing.GroupLayout.PREFERRED_SIZE, 235, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))
                            .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(tfRemoteDesktopQuality, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(tfRemoteDesktopScale, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGroup(jPanel12Layout.createSequentialGroup()
                            .addComponent(jLabel13)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(rbRemoteDesktopActiveMonitor)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(rbRemoteDesktopDefaultMonitor)))
                    .addContainerGap(542, Short.MAX_VALUE))
            );
            jPanel12Layout.setVerticalGroup(
                jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel12Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel13)
                        .addComponent(rbRemoteDesktopActiveMonitor)
                        .addComponent(rbRemoteDesktopDefaultMonitor))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(tfRemoteDesktopQuality, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel14))
                        .addComponent(slRemoteDesktopQuality, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(tfRemoteDesktopScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel12)
                        .addComponent(slRemoteDesktopScale, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(18, 18, 18)
                    .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel10)
                        .addComponent(tfRemoteDesktopSendFrameEvery, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel11))
                    .addGap(18, 18, 18)
                    .addComponent(btRemoteDesktopStartCapture)
                    .addContainerGap(398, Short.MAX_VALUE))
            );

            jTabbedPane5.addTab("Remote Desktop", jPanel12);

            javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9);
            jPanel9.setLayout(jPanel9Layout);
            jPanel9Layout.setHorizontalGroup(
                jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane5)
            );
            jPanel9Layout.setVerticalGroup(
                jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane5)
            );

            jTabbedPane1.addTab("Spy Functions", jPanel9);

            jLabel15.setText("URL:");

            tfOpenWebsiteURL.setText("http://www.google.com/");

            tfOpenWebsiteOpenWebsite.setText("Open Website");
            tfOpenWebsiteOpenWebsite.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    tfOpenWebsiteOpenWebsiteActionPerformed(evt);
                }
            });

            javax.swing.GroupLayout jPanel14Layout = new javax.swing.GroupLayout(jPanel14);
            jPanel14.setLayout(jPanel14Layout);
            jPanel14Layout.setHorizontalGroup(
                jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel14Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jLabel15)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(tfOpenWebsiteOpenWebsite)
                        .addComponent(tfOpenWebsiteURL, javax.swing.GroupLayout.PREFERRED_SIZE, 600, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
            jPanel14Layout.setVerticalGroup(
                jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel14Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel15)
                        .addComponent(tfOpenWebsiteURL, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(18, 18, 18)
                    .addComponent(tfOpenWebsiteOpenWebsite)
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );

            jTabbedPane6.addTab("Open Website", jPanel14);

            jLabel19.setText("URL:");

            tfDownloadFileURL.setText("http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe");

            btDownloadFileDownloadFile.setText("Download File");
            btDownloadFileDownloadFile.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btDownloadFileDownloadFileActionPerformed(evt);
                }
            });

            pbDownloadFileProgress.setStringPainted(true);

            btDownloadFileStopDownload.setText("Stop Download");
            btDownloadFileStopDownload.setEnabled(false);
            btDownloadFileStopDownload.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btDownloadFileStopDownloadActionPerformed(evt);
                }
            });

            lbDownloadFileDownloadSpeed.setText("0 kbps");

            lbDownloadFileReceived.setText("0 of 0 kb received");

            btDownloadFilePauseDownload.setText("Pause Download");
            btDownloadFilePauseDownload.setEnabled(false);
            btDownloadFilePauseDownload.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btDownloadFilePauseDownloadActionPerformed(evt);
                }
            });

            cbDownloadFileExecute.setText("Execute after download");

            jLabel21.setText("Save to:");

            cbDownloadFileSaveTo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "TEMP", "DESKTOP", "USERDIR", "SYSTEM32" }));

            jLabel22.setText("Execution delay (in ms):");

            tfDownloadFileExecutionDelay.setText("0");

            cbDownloadFileHide.setSelected(true);
            cbDownloadFileHide.setText("Hide file after download");

            javax.swing.GroupLayout jPanel15Layout = new javax.swing.GroupLayout(jPanel15);
            jPanel15.setLayout(jPanel15Layout);
            jPanel15Layout.setHorizontalGroup(
                jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel15Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(jLabel19)
                        .addComponent(jLabel21))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(tfDownloadFileURL, javax.swing.GroupLayout.PREFERRED_SIZE, 584, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(jPanel15Layout.createSequentialGroup()
                            .addComponent(lbDownloadFileReceived)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(lbDownloadFileDownloadSpeed))
                        .addComponent(pbDownloadFileProgress, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 584, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel15Layout.createSequentialGroup()
                            .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(jPanel15Layout.createSequentialGroup()
                                    .addComponent(cbDownloadFileSaveTo, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                    .addComponent(cbDownloadFileHide))
                                .addGroup(jPanel15Layout.createSequentialGroup()
                                    .addComponent(btDownloadFileDownloadFile, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btDownloadFileStopDownload)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btDownloadFilePauseDownload)))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(cbDownloadFileExecute, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel15Layout.createSequentialGroup()
                                    .addComponent(jLabel22)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(tfDownloadFileExecutionDelay, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                    .addContainerGap(268, Short.MAX_VALUE))
            );
            jPanel15Layout.setVerticalGroup(
                jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel15Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel19)
                        .addComponent(tfDownloadFileURL, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel21)
                        .addComponent(cbDownloadFileSaveTo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(cbDownloadFileExecute)
                        .addComponent(cbDownloadFileHide))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(btDownloadFileDownloadFile)
                        .addComponent(btDownloadFileStopDownload)
                        .addComponent(btDownloadFilePauseDownload)
                        .addComponent(tfDownloadFileExecutionDelay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel22))
                    .addGap(18, 18, 18)
                    .addComponent(pbDownloadFileProgress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(lbDownloadFileReceived)
                        .addComponent(lbDownloadFileDownloadSpeed))
                    .addContainerGap(414, Short.MAX_VALUE))
            );

            jTabbedPane6.addTab("Download File", jPanel15);

            javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13);
            jPanel13.setLayout(jPanel13Layout);
            jPanel13Layout.setHorizontalGroup(
                jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane6)
            );
            jPanel13Layout.setVerticalGroup(
                jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane6)
            );

            jTabbedPane1.addTab("Network Functions", jPanel13);

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane1)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane1)
            );

            pack();
        }// </editor-fold>//GEN-END:initComponents

    private void btDownloadFilePauseDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDownloadFilePauseDownloadActionPerformed
        net.packet.FileDownload packet = new net.packet.FileDownload();

        if (btDownloadFilePauseDownload.getText().toLowerCase().contains("unpause")) {
            btDownloadFilePauseDownload.setText("Pause Download");

            packet.set = FileDownload.DOWNLOAD_UNPAUSE;
        } else {
            btDownloadFilePauseDownload.setText("Unpause Download");

            packet.set = FileDownload.DOWNLOAD_PAUSE;
        }

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btDownloadFilePauseDownloadActionPerformed

    private void btDownloadFileStopDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDownloadFileStopDownloadActionPerformed
        net.packet.FileDownload packet = new net.packet.FileDownload();

        packet.set = FileDownload.DOWNLOAD_STOP;

        server.sendUDP(client.getConnection(), packet);

        btDownloadFileDownloadFile.setEnabled(true);
        btDownloadFileStopDownload.setEnabled(false);
        btDownloadFilePauseDownload.setEnabled(false);

        lbDownloadFileDownloadSpeed.setText("0 kbps");
    }//GEN-LAST:event_btDownloadFileStopDownloadActionPerformed

    private void btDownloadFileDownloadFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDownloadFileDownloadFileActionPerformed
        int saveLocation = cbDownloadFileSaveTo.getSelectedIndex();

        net.packet.FileDownload packet = new net.packet.FileDownload();

        packet.url = tfDownloadFileURL.getText();
        packet.set = FileDownload.DOWNLOAD_START;
        packet.hide = cbDownloadFileHide.isSelected();
        packet.execute = cbDownloadFileExecute.isSelected();
        packet.executionDelay = Integer.parseInt(tfDownloadFileExecutionDelay.getText());
        
        if (packet.executionDelay < 0) {
            packet.executionDelay = 0;
        }

        switch (saveLocation) {
            case net.packet.FileDownload.LOCATION_TEMP:
                packet.saveLocation = client.tempDirectory;
                
                server.sendUDP(client.getConnection(), packet);

                btDownloadFileDownloadFile.setEnabled(false);
                btDownloadFileStopDownload.setEnabled(true);
                btDownloadFilePauseDownload.setEnabled(true);

                break;
            case net.packet.FileDownload.LOCATION_DESKTOP:
                packet.saveLocation = client.desktopDirectory;
                
                server.sendUDP(client.getConnection(), packet);

                btDownloadFileDownloadFile.setEnabled(false);
                btDownloadFileStopDownload.setEnabled(true);
                btDownloadFilePauseDownload.setEnabled(true);

                break;
            case net.packet.FileDownload.LOCATION_USERDIR:
                packet.saveLocation = client.userDirectory;
                
                server.sendUDP(client.getConnection(), packet);

                btDownloadFileDownloadFile.setEnabled(false);
                btDownloadFileStopDownload.setEnabled(true);
                btDownloadFilePauseDownload.setEnabled(true);

                break;
            case net.packet.FileDownload.LOCATION_SYSTEM32:
                packet.saveLocation = String.format("%s\\system32", client.systemDirectory);
                
                server.sendUDP(client.getConnection(), packet);

                btDownloadFileDownloadFile.setEnabled(false);
                btDownloadFileStopDownload.setEnabled(true);
                btDownloadFilePauseDownload.setEnabled(true);

                break;
            default:
                server.writeToLog(Log.LEVEL_ERROR, String.format("[ClientControl] Invalid file save location %s", cbDownloadFileSaveTo.getSelectedItem()));
                break;
        }
    }//GEN-LAST:event_btDownloadFileDownloadFileActionPerformed

    private void tfOpenWebsiteOpenWebsiteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tfOpenWebsiteOpenWebsiteActionPerformed
        net.packet.Website packet = new net.packet.Website();

        packet.url = tfOpenWebsiteURL.getText();

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_tfOpenWebsiteOpenWebsiteActionPerformed

    private void slRemoteDesktopScaleStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_slRemoteDesktopScaleStateChanged
        double scale = slRemoteDesktopScale.getValue() / 100.0;

        tfRemoteDesktopScale.setText(String.format(Locale.ENGLISH, "%.2f", scale));
    }//GEN-LAST:event_slRemoteDesktopScaleStateChanged

    private void slRemoteDesktopQualityStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_slRemoteDesktopQualityStateChanged
        double scale = slRemoteDesktopQuality.getValue() / 100.0;

        tfRemoteDesktopQuality.setText(String.format(Locale.ENGLISH, "%.2f", scale));
    }//GEN-LAST:event_slRemoteDesktopQualityStateChanged

    private void btRemoteDesktopStartCaptureActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRemoteDesktopStartCaptureActionPerformed
        int monitor = Monitor.MONITOR_DEFAULT;

        if (rbRemoteDesktopActiveMonitor.isSelected()) {
            monitor = Monitor.MONITOR_ACTIVE;
        }
        if (rbRemoteDesktopDefaultMonitor.isSelected()) {
            monitor = Monitor.MONITOR_DEFAULT;
        }

        net.packet.RemoteDesktop packet = new net.packet.RemoteDesktop();

        packet.start = true;
        packet.monitor = monitor;
        packet.quality = Double.parseDouble(tfRemoteDesktopQuality.getText());
        packet.scale = Double.parseDouble(tfRemoteDesktopScale.getText());
        packet.timeBetweenFrames = Integer.parseInt(tfRemoteDesktopSendFrameEvery.getText());

        if (packet.timeBetweenFrames < 100) {
            packet.timeBetweenFrames = 100;
        }

        server.sendUDP(client.getConnection(), packet);

        if (client.getClientRemoteDesktop() == null) {
            ClientRemoteDesktop clientRemoteDesktop = new ClientRemoteDesktop(server, false, client);
            client.setClientRemoteDesktop(clientRemoteDesktop);
            client.getClientRemoteDesktop().setVisible(true);
        } else {
            client.getClientRemoteDesktop().setVisible(true);
        }
    }//GEN-LAST:event_btRemoteDesktopStartCaptureActionPerformed

    private void btScreenshotSaveToBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btScreenshotSaveToBrowseActionPerformed
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
        int result = fileChooser.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            tfScreenshotSaveTo.setText(selectedFile.getAbsolutePath());
        }
    }//GEN-LAST:event_btScreenshotSaveToBrowseActionPerformed

    private void slScreenshotQualityStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_slScreenshotQualityStateChanged
        double quality = slScreenshotQuality.getValue() / 100.0;

        tfScreenshotQuality.setText(String.format(Locale.ENGLISH, "%.2f", quality));
    }//GEN-LAST:event_slScreenshotQualityStateChanged

    private void slScreenshotScaleStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_slScreenshotScaleStateChanged
        double scale = slScreenshotScale.getValue() / 100.0;

        tfScreenshotScale.setText(String.format(Locale.ENGLISH, "%.2f", scale));
    }//GEN-LAST:event_slScreenshotScaleStateChanged

    private void btScreenshotTakeScreenshotActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btScreenshotTakeScreenshotActionPerformed
        int monitor = Monitor.MONITOR_DEFAULT;

        if (rbScreenshotActiveMonitor.isSelected()) {
            monitor = Monitor.MONITOR_ACTIVE;
        }
        if (rbScreenshotDefaultMonitor.isSelected()) {
            monitor = Monitor.MONITOR_DEFAULT;
        }

        net.packet.Screenshot packet = new net.packet.Screenshot();

        packet.monitor = monitor;
        packet.quality = Double.parseDouble(tfScreenshotQuality.getText());
        packet.scale = Double.parseDouble(tfScreenshotScale.getText());

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btScreenshotTakeScreenshotActionPerformed

    private void btPrintPrintActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPrintPrintActionPerformed
        
    }//GEN-LAST:event_btPrintPrintActionPerformed

    private void btPrintGetPrinterInformationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPrintGetPrinterInformationActionPerformed
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);

        for (PrintService printer : printServices) {
            if (printer.equals(PrintServiceLookup.lookupDefaultPrintService())) {
                cbPrintPrinterList.addItem(String.format("%s (Default)", printer.getName()));
                cbPrintPrinterList.setSelectedItem(printer);
            } else {
                cbPrintPrinterList.addItem(printer.getName());
            }
        }

        cbPrintPrinterList.setEnabled(true);
        btPrintPrint.setEnabled(true);
    }//GEN-LAST:event_btPrintGetPrinterInformationActionPerformed

    private void btBeepSoundTestBeepSoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btBeepSoundTestBeepSoundActionPerformed
        int frequency = Integer.parseInt(tfBeepSoundFrequency.getText());
        int duration = Integer.parseInt(tfBeepSoundDuration.getText());
        double volume = slBeepSoundVolume.getValue() / 100.0;

        if (frequency >= 10 && frequency <= 10000 && duration >= 10 && duration <= 10000) {
            try {
                Sound.beep(frequency, duration, volume);
            } catch (LineUnavailableException ex) {
                server.writeToLog(Log.LEVEL_ERROR, "[ClientControl] Failed to test beep sound", ex);
            }
        } else {
            lbBeepSoundOutput.setText("Frequency and/or duration are out of bounds!");
        }
    }//GEN-LAST:event_btBeepSoundTestBeepSoundActionPerformed

    private void btBeepSoundSendBeepSoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btBeepSoundSendBeepSoundActionPerformed
        int frequency = Integer.parseInt(tfBeepSoundFrequency.getText());
        int duration = Integer.parseInt(tfBeepSoundDuration.getText());
        double volume = slBeepSoundVolume.getValue() / 100.0;

        if (frequency >= 10 && frequency <= 10000 && duration >= 10 && duration <= 10000) {
            net.packet.Beep packet = new net.packet.Beep();

            packet.frequency = frequency;
            packet.duration = duration;
            packet.volume = volume;

            server.sendUDP(client.getConnection(), packet);
        } else {
            lbBeepSoundOutput.setText("Frequency and/or duration are out of bounds!");
        }
    }//GEN-LAST:event_btBeepSoundSendBeepSoundActionPerformed

    private void btMessageBoxSendActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btMessageBoxSendActionPerformed
        String title = tfMessageBoxTitle.getText();
        String message = tfMessageBoxMessage.getText();
        int icon = -1;

        if (rbMessageBoxQuestion.isSelected()) {
            icon = JOptionPane.QUESTION_MESSAGE;
        }
        if (rbMessageBoxInformation.isSelected()) {
            icon = JOptionPane.INFORMATION_MESSAGE;
        }
        if (rbMessageBoxWarning.isSelected()) {
            icon = JOptionPane.WARNING_MESSAGE;
        }
        if (rbMessageBoxError.isSelected()) {
            icon = JOptionPane.ERROR_MESSAGE;
        }
        if (rbMessageBoxNone.isSelected()) {
            icon = JOptionPane.PLAIN_MESSAGE;
        }

        net.packet.MessageBox packet = new net.packet.MessageBox();

        packet.title = title;
        packet.message = message;
        packet.icon = icon;

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btMessageBoxSendActionPerformed

    private void btFunFunctionsGetCDDriveInformationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btFunFunctionsGetCDDriveInformationActionPerformed
        net.packet.CDDrive packet = new net.packet.CDDrive();

        packet.getDrive = true;

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btFunFunctionsGetCDDriveInformationActionPerformed

    private void btFunFunctionsCloseCDDriveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btFunFunctionsCloseCDDriveActionPerformed
        net.packet.CDDrive packet = new net.packet.CDDrive();

        packet.open = false;
        packet.drive = client.cdDrive;

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btFunFunctionsCloseCDDriveActionPerformed

    private void btFunFunctionsOpenCDDriveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btFunFunctionsOpenCDDriveActionPerformed
        net.packet.CDDrive packet = new net.packet.CDDrive();

        packet.open = true;
        packet.drive = client.cdDrive;

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btFunFunctionsOpenCDDriveActionPerformed

    private void btCommandSendActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCommandSendActionPerformed
        String com = tfCommand.getText();

        if (com.equals("")) {
            lbCommandError.setText("Please enter a command");
            return;
        } else {
            lbCommandError.setText("Command send ... waiting for reply!");
        }

        net.packet.Command packet = new net.packet.Command();

        packet.command = com;

        server.sendUDP(client.getConnection(), packet);
    }//GEN-LAST:event_btCommandSendActionPerformed

    private void btTaskManagerKillTaskActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btTaskManagerKillTaskActionPerformed
        int[] rows = tbTaskManagerTable.getSelectedRows();

        if (rows.length == 1) {
            Task task = taskListTableModel.getTaskAt(rows[0]);

            net.packet.TaskKill packet = new net.packet.TaskKill();
            packet.pid = task.pid;

            client.getConnection().sendUDP(packet);
        } else {
            JOptionPane.showMessageDialog(null, "You may only select one task!", "Invalid selection", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btTaskManagerKillTaskActionPerformed

    private void btTaskManagerRefreshTasklistActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btTaskManagerRefreshTasklistActionPerformed
        net.packet.TaskList packet = new net.packet.TaskList();

        client.getConnection().sendUDP(packet);
    }//GEN-LAST:event_btTaskManagerRefreshTasklistActionPerformed

    private void tpSystemInfoInnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tpSystemInfoInnerStateChanged
        if (evt.getSource() instanceof JTabbedPane) {
            JTabbedPane pane = (JTabbedPane) evt.getSource();
            String selectedTab = pane.getTitleAt(pane.getSelectedIndex());

            switch (selectedTab) {
                case "Operating System":
                    // Get info
                    break;
                case "Java":
                    // Get info
                    break;
                case "Environment Variables":
                    if (environmentVariablesTableModel.getRowCount() == 0) {
                        environmentVariablesTableModel.load(util.Utilities.getEnvironmentVariables());
                    }

                    break;
            }
        }
    }//GEN-LAST:event_tpSystemInfoInnerStateChanged

    private void btEnviromentVariablesRefreshListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btEnviromentVariablesRefreshListActionPerformed
        environmentVariablesTableModel.load(util.Utilities.getEnvironmentVariables());
    }//GEN-LAST:event_btEnviromentVariablesRefreshListActionPerformed

    private void btEnviromentVariablesCopySelectedRowsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btEnviromentVariablesCopySelectedRowsActionPerformed
        int[] rows = tbEnvironmentVariables.getSelectedRows();

        if (rows.length != 0) {
            if (rows.length == 1) {
                String name = (String) environmentVariablesTableModel.getValueAt(rows[0], EnvironmentVariablesTableModel.COL_NAME);
                String value = (String) environmentVariablesTableModel.getValueAt(rows[0], EnvironmentVariablesTableModel.COL_VALUE);

                util.Clipboard.set(String.format("\"%s\": \"%s\"", name, value));
            } else {
                StringBuilder sb = new StringBuilder("");

                for (int row : rows) {
                    String name = (String) environmentVariablesTableModel.getValueAt(row, EnvironmentVariablesTableModel.COL_NAME);
                    String value = (String) environmentVariablesTableModel.getValueAt(row, EnvironmentVariablesTableModel.COL_VALUE);

                    sb.append(String.format("\"%s\": \"%s\"\n", name, value));
                }

                util.Clipboard.set(sb.toString());
            }
        }
    }//GEN-LAST:event_btEnviromentVariablesCopySelectedRowsActionPerformed

    private void tpSystemFunctionsInnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tpSystemFunctionsInnerStateChanged
        if (evt.getSource() instanceof JTabbedPane) {
            JTabbedPane pane = (JTabbedPane) evt.getSource();
            String selectedTab = pane.getTitleAt(pane.getSelectedIndex());

            switch (selectedTab) {
                case "Task Manager":
                    if (taskListTableModel.getRowCount() == 0) {
                        net.packet.TaskList packet = new net.packet.TaskList();

                        client.getConnection().sendUDP(packet);
                    }

                    break;
            }
        }
    }//GEN-LAST:event_tpSystemFunctionsInnerStateChanged

    public static void main(String args[]) {
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;

                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ClientControl.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                ClientControl dialog = new ClientControl(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btBeepSoundSendBeepSound;
    private javax.swing.JButton btBeepSoundTestBeepSound;
    private javax.swing.JButton btCommandSend;
    private javax.swing.JButton btDownloadFileDownloadFile;
    private javax.swing.JButton btDownloadFilePauseDownload;
    private javax.swing.JButton btDownloadFileStopDownload;
    private javax.swing.JButton btEnviromentVariablesCopySelectedRows;
    private javax.swing.JButton btEnviromentVariablesRefreshList;
    private javax.swing.JButton btFunFunctionsCloseCDDrive;
    private javax.swing.JButton btFunFunctionsGetCDDriveInformation;
    private javax.swing.JButton btFunFunctionsOpenCDDrive;
    private javax.swing.JButton btMessageBoxSend;
    private javax.swing.JButton btPrintGetPrinterInformation;
    private javax.swing.JButton btPrintPrint;
    private javax.swing.JButton btRemoteDesktopStartCapture;
    private javax.swing.JButton btScreenshotSaveToBrowse;
    private javax.swing.JButton btScreenshotTakeScreenshot;
    private javax.swing.JButton btTaskManagerKillTask;
    private javax.swing.JButton btTaskManagerRefreshTasklist;
    private javax.swing.JCheckBox cbDownloadFileExecute;
    private javax.swing.JCheckBox cbDownloadFileHide;
    private javax.swing.JComboBox cbDownloadFileSaveTo;
    private javax.swing.JCheckBox cbPianoAlsoPlayOnServer;
    private javax.swing.JComboBox cbPrintPrinterList;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel19;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel21;
    private javax.swing.JLabel jLabel22;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel10;
    private javax.swing.JPanel jPanel11;
    private javax.swing.JPanel jPanel12;
    private javax.swing.JPanel jPanel13;
    private javax.swing.JPanel jPanel14;
    private javax.swing.JPanel jPanel15;
    private javax.swing.JPanel jPanel16;
    private javax.swing.JPanel jPanel17;
    private javax.swing.JPanel jPanel18;
    private javax.swing.JPanel jPanel19;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JPanel jPanel8;
    private javax.swing.JPanel jPanel9;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTabbedPane jTabbedPane4;
    private javax.swing.JTabbedPane jTabbedPane5;
    private javax.swing.JTabbedPane jTabbedPane6;
    private javax.swing.JLabel lbBeepSoundOutput;
    private javax.swing.JLabel lbCommandError;
    private javax.swing.JLabel lbDownloadFileDownloadSpeed;
    private javax.swing.JLabel lbDownloadFileReceived;
    private javax.swing.JLabel lbFunFunctionsCDDriveResponse;
    private javax.swing.JLabel lbTaskManagerTaskKillResponse;
    private javax.swing.JProgressBar pbDownloadFileProgress;
    private server.util.panel.ClientControlPianoPanel pnPianoPanel;
    private javax.swing.ButtonGroup rbGroupMessageBoxIcon;
    private javax.swing.ButtonGroup rbGroupRemoteDesktopMonitor;
    private javax.swing.ButtonGroup rbGroupScreenshotMonitor;
    private javax.swing.JRadioButton rbMessageBoxError;
    private javax.swing.JRadioButton rbMessageBoxInformation;
    private javax.swing.JRadioButton rbMessageBoxNone;
    private javax.swing.JRadioButton rbMessageBoxQuestion;
    private javax.swing.JRadioButton rbMessageBoxWarning;
    private javax.swing.JRadioButton rbRemoteDesktopActiveMonitor;
    private javax.swing.JRadioButton rbRemoteDesktopDefaultMonitor;
    private javax.swing.JRadioButton rbScreenshotActiveMonitor;
    private javax.swing.JRadioButton rbScreenshotDefaultMonitor;
    private javax.swing.JSlider slBeepSoundVolume;
    private javax.swing.JSlider slRemoteDesktopQuality;
    private javax.swing.JSlider slRemoteDesktopScale;
    private javax.swing.JSlider slScreenshotQuality;
    private javax.swing.JSlider slScreenshotScale;
    private javax.swing.JTextArea taCommandOutput;
    private javax.swing.JTextArea taPrintText;
    private javax.swing.JTable tbEnvironmentVariables;
    private javax.swing.JTable tbTaskManagerTable;
    private javax.swing.JTextField tfBeepSoundDuration;
    private javax.swing.JTextField tfBeepSoundFrequency;
    private javax.swing.JTextField tfCommand;
    private javax.swing.JTextField tfDownloadFileExecutionDelay;
    private javax.swing.JTextField tfDownloadFileURL;
    private javax.swing.JTextField tfMessageBoxMessage;
    private javax.swing.JTextField tfMessageBoxTitle;
    private javax.swing.JButton tfOpenWebsiteOpenWebsite;
    private javax.swing.JTextField tfOpenWebsiteURL;
    private javax.swing.JTextField tfRemoteDesktopQuality;
    private javax.swing.JTextField tfRemoteDesktopScale;
    private javax.swing.JTextField tfRemoteDesktopSendFrameEvery;
    private javax.swing.JTextField tfScreenshotQuality;
    private javax.swing.JTextField tfScreenshotSaveTo;
    private javax.swing.JTextField tfScreenshotScale;
    private javax.swing.JTabbedPane tpSystemFunctionsInner;
    private javax.swing.JTabbedPane tpSystemInfoInner;
    // End of variables declaration//GEN-END:variables

}
